//package com.example.demo.service;
//
//import com.example.demo.model.Question;
//import com.example.demo.model.User;
//import io.milvus.client.MilvusServiceClient;
//import io.milvus.grpc.DataType;
//import io.milvus.grpc.MutationResult;
//import io.milvus.param.R;
//import io.milvus.param.RpcStatus;
//import io.milvus.param.collection.CreateCollectionParam;
//import io.milvus.param.collection.FieldType;
//import io.milvus.param.dml.InsertParam;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Service;
//
//import javax.annotation.PostConstruct;
//import java.util.ArrayList;
//import java.util.List;
//import java.util.concurrent.atomic.AtomicLong;
//
///**
// * 注释说明：
// *
// * 类整体功能：负责将用户的问题及回答保存到 Milvus 向量数据库中，并在启动时初始化存储问题的集合结构。
// * 关键组件：
// * MilvusService：与 Milvus 数据库交互的封装服务。
// * UserService：用于获取当前提问的用户信息。
// * 核心方法：
// * createQuestionCollection()：初始化 Milvus 集合（类似数据库表），定义字段结构。
// * saveQuestion(...)：接收用户提问信息和回答，构造数据并插入 Milvus。
// * 暂未实现功能：获取用户历史问题（已用注释标明，需要实现 Milvus 查询逻辑）。
// */
//@Service
//public class QuestionServiceMilvus {
//    // 日志记录器
//    private static final Logger logger = LoggerFactory.getLogger(QuestionServiceMilvus.class);
//    // Milvus 中存储问题的集合名称
//    private static final String COLLECTION_NAME = "questions";
//    // 用于生成问题ID的自增计数器，从1开始
//    private static final AtomicLong idCounter = new AtomicLong(1);
//
//    // Milvus 服务组件，用于与 Milvus 数据库交互
//    private final MilvusService milvusService;
//    // 用户服务组件，用于获取用户信息
//    private final UserService userService;
//
//    // 构造函数，由 Spring 自动注入 MilvusService 和 UserService
//    @Autowired
//    public QuestionServiceMilvus(MilvusService milvusService, UserService userService) {
//        this.milvusService = milvusService;
//        this.userService = userService;
//    }
//
//    // 在 Bean 初始化完成后自动调用，用于创建 Milvus 中的问题集合
//    @PostConstruct
//    public void init() {
//        createQuestionCollection();
//    }
//
//    // 创建 Milvus 中存储问题的集合（类似数据库中的表）
//    private void createQuestionCollection() {
//        try {
//            // 获取 Milvus 客户端
//            MilvusServiceClient client = milvusService.getClient();
//
//            // 定义各个字段的类型和属性
//            FieldType idField = FieldType.newBuilder()
//                    .withName("id") // 字段名
//                    .withDataType(DataType.Int64) // 数据类型：64位整型
//                    .withPrimaryKey(true) // 是否是主键
//                    .withAutoID(false) // 是否自动生成ID，这里设为false，手动指定
//                    .build();
//
//            FieldType userIdField = FieldType.newBuilder()
//                    .withName("user_id")
//                    .withDataType(DataType.Int64)
//                    .build();
//
//            FieldType usernameField = FieldType.newBuilder()
//                    .withName("username")
//                    .withDataType(DataType.VarChar) // 可变长度字符串
//                    .withMaxLength(100) // 最大长度100
//                    .build();
//
//            FieldType questionTextField = FieldType.newBuilder()
//                    .withName("question_text")
//                    .withDataType(DataType.VarChar)
//                    .withMaxLength(2000)
//                    .build();
//
//            FieldType answerTextField = FieldType.newBuilder()
//                    .withName("answer_text")
//                    .withDataType(DataType.VarChar)
//                    .withMaxLength(5000)
//                    .build();
//
//            FieldType createdAtField = FieldType.newBuilder()
//                    .withName("created_at")
//                    .withDataType(DataType.VarChar)
//                    .withMaxLength(30)
//                    .build();
//
//            // 构建创建集合的请求参数，包含集合名与所有字段定义
//            CreateCollectionParam createCollectionReq = CreateCollectionParam.newBuilder()
//                    .withCollectionName(COLLECTION_NAME)
//                    .addFieldType(idField)
//                    .addFieldType(userIdField)
//                    .addFieldType(usernameField)
//                    .addFieldType(questionTextField)
//                    .addFieldType(answerTextField)
//                    .addFieldType(createdAtField)
//                    .build();
//
//            // 发送创建集合的请求
//            R<RpcStatus> response = client.createCollection(createCollectionReq);
//            if (response.getStatus() != R.Status.Success.getCode()) {
//                // 创建失败，记录错误日志
//                logger.error("Failed to create collection: {}", response.getMessage());
//            } else {
//                // 创建成功，记录信息日志
//                logger.info("Collection {} created successfully", COLLECTION_NAME);
//            }
//        } catch (Exception e) {
//            // 捕获并记录创建集合过程中出现的异常
//            logger.error("Error creating collection", e);
//        }
//    }
//
//    // 保存用户提问及回答到 Milvus 中
//    public Question saveQuestion(String username, String questionText, String answerText) {
//        try {
//            // 根据用户名获取用户信息
//            User user = userService.getUserByUsername(username).orElse(null);
//            if (user == null) {
//                // 用户不存在，记录错误并返回null
//                logger.error("User not found: {}", username);
//                return null;
//            }
//
//            // 生成新的问题ID
//            Long questionId = idCounter.getAndIncrement();
//            // 构建 Question 对象
//            Question question = new Question(user.getId(), username, questionText, answerText);
//            question.setId(questionId);
//
//            // 获取 Milvus 客户端
//            MilvusServiceClient client = milvusService.getClient();
//
//            // 构建插入数据时各个字段的值列表
//            List<Long> ids = new ArrayList<>();
//            ids.add(questionId);
//
//            List<Long> userIds = new ArrayList<>();
//            userIds.add(user.getId());
//
//            List<String> usernames = new ArrayList<>();
//            usernames.add(username);
//
//            List<String> questionTexts = new ArrayList<>();
//            questionTexts.add(questionText);
//
//            List<String> answerTexts = new ArrayList<>();
//            answerTexts.add(answerText);
//
//            List<String> createdAts = new ArrayList<>();
//            createdAts.add(question.getCreatedAt().toString());
//
//            // 将各个字段的值封装为 InsertParam.Field 对象，并添加到字段列表中
//            List<InsertParam.Field> fields = new ArrayList<>();
//            fields.add(new InsertParam.Field("id", ids));
//            fields.add(new InsertParam.Field("user_id", userIds));
//            fields.add(new InsertParam.Field("username", usernames));
//            fields.add(new InsertParam.Field("question_text", questionTexts));
//            fields.add(new InsertParam.Field("answer_text", answerTexts));
//            fields.add(new InsertParam.Field("created_at", createdAts));
//
//            // 构建插入参数
//            InsertParam insertParam = InsertParam.newBuilder()
//                    .withCollectionName(COLLECTION_NAME)
//                    .withFields(fields)
//                    .build();
//
//            // 执行插入操作
//            R<MutationResult> insertResponse = client.insert(insertParam);
//
//            if (insertResponse.getStatus() != R.Status.Success.getCode()) {
//                // 插入失败，记录错误日志
//                logger.error("Failed to insert question: {}", insertResponse.getMessage());
//                return null;
//            }
//
//            // 插入成功，记录信息并返回保存的问题对象
//            logger.info("Question saved successfully with ID: {}", questionId);
//            return question;
//        } catch (Exception e) {
//            // 捕获并记录保存问题过程中出现的异常
//            logger.error("Error saving question", e);
//            return null;
//        }
//    }
//
//    // TODO：此处可添加获取用户提问历史的方法，需要实现 Milvus 的查询功能
//}
